package service

import (
	"CHATROOM/logic"
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"nhooyr.io/websocket"
)

func WebsocketMessage(ctx *gin.Context) {
	username := ctx.Query("username")
	fmt.Println("websocket username", username)
	if !logic.Broadcaster.CanEnterRoom(username) {
		fmt.Println("昵称已经存在：", username)
		ctx.JSON(http.StatusOK, gin.H{
			"code":    401,
			"message": "用户名已存在",
		})
		return
	}
	fmt.Println("enter")

	// Accept 从客户端接受 WebSocket 握手，并将连接升级到 WebSocket。
	// 如果 Origin 域与主机不同，Accept 将拒绝握手，除非设置了 InsecureSkipVerify 选项（通过第三个参数 AcceptOptions 设置）。
	// 换句话说，默认情况下，它不允许跨源请求。如果发生错误，Accept 将始终写入适当的响应
	conn, err := websocket.Accept(ctx.Writer, ctx.Request, &websocket.AcceptOptions{
		// OriginPatterns:     []string{"localhost:7456"},
		InsecureSkipVerify: true,
	})
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "系统异常：" + err.Error(),
		})
		return
	}
	//生成一个新用户
	userHasToken := logic.NewUser(conn, username)
	// 2. 开启给用户发送消息的 goroutine
	go userHasToken.SendMessage(ctx)
	// 3. 给当前用户发送欢迎信息
	// userHasToken.MessageChannel <- "Welcome, " + username
	// 给所有用户告知新用户到来
	logic.Broadcaster.Broadcast(userHasToken, username+"我来了!")

	// 4. 将该用户加入广播器的用户列表中
	logic.Broadcaster.UserEntering(userHasToken)

	// 5. 接收用户消息
	err = userHasToken.ReceiveMessage(ctx)

	// 6. 用户离开

	msg := userHasToken.Username + " 离开了聊天室"
	logic.Broadcaster.Broadcast(userHasToken, msg)

	fmt.Println("user:", userHasToken.Username, "leaves chat")
	logic.Broadcaster.UserLeaving(userHasToken)
	// 根据读取时的错误执行不同的 Close
	if err == nil {
		conn.Close(websocket.StatusNormalClosure, "")
	} else {
		// log.Println("read from client error:", err)
		fmt.Println("read from client error:", err)
		conn.Close(websocket.StatusInternalError, "Read from client error")
	}
	// defer conn.Close(websocket.StatusInternalError, "Read from client error")
}
